/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

/**
 *
 * @author Jorge Maldonado
 */
public class usuario {

    private String nombre;
    private float dinero;
    private int posicion;
    private int tiros;
    private int num_servicios;
    private ArrayList<propiedad> propiedades;
    private boolean preso;
    private boolean pase;
    private int turnos_perdidos;
    private JLabel ficha;
    private int numJugador;
    private float deuda;
    private propiedad[] props;
    private tarjeta tg;
    public static final int CANTIDAD_MORADO=2,CANTIDAD_CIAN=3,CANTIDAD_VIOLETA=3,
            CANTIDAD_NARANJA=3,CANTIDAD_ROJO=3,CANTIDAD_AMARILLO=3,CANTIDAD_VERDE=3,CANTIDAD_AZUL=2;
    public int morado=0,cian=0,violeta=0,naranja=0,rojo=0,amarillo=0,verde=0,azul=0;
    public static String[] imagenes = {"/img/ficha_roja.png", "/img/ficha_azul.png",
        "/img/ficha_verde.png", "/img/ficha_amarillo.png"};

    public usuario(String nombre, int numJugador) {
        this.nombre = nombre;
        dinero = 2000;
        posicion = 0;
        deuda = 0;
        propiedades = new ArrayList();
        preso = false;
        pase = false;
        num_servicios = 0;
        turnos_perdidos = 0;
        tiros=0;
        this.numJugador = numJugador;
        ficha = new JLabel();
        tg=new tarjeta();
        ficha.setIcon(new ImageIcon(getClass().getResource(imagenes[numJugador])));
    }

    public void setPros(propiedad[] props) {
        this.props = props;
    }

    public void gastarPenitencia() {
        turnos_perdidos--;
        if (turnos_perdidos == 0) {
            if (preso) {
                preso = false;
            }
        }
    }

    public void posicionar() {
        switch (posicion) {
            case 0:
                ficha.setBounds(600, 570, 50, 50);
                break;
            case 1:
                ficha.setBounds(538, 572, 50, 50);

                break;
            case 2:
                ficha.setBounds(473, 572, 50, 50);
                tg.mostrarComunidad((int)(Math.random()*12+1), this, props);
                break;
            case 3:
                ficha.setBounds(420, 572, 50, 50);
                break;
            case 4:
                ficha.setBounds(365, 572, 50, 50);
                if (getDinero() < 200) {
                    if (tienePropiedades()) {
                        int resultado = JOptionPane.showConfirmDialog(null, "Desea hipotecar una propiedad para pagar?", "Atención", JOptionPane.INFORMATION_MESSAGE);
                        if (resultado == JOptionPane.OK_OPTION) {
                            hipoteca aux = new hipoteca(this);
                            propiedad temp = aux.mostrar();
                            if (temp != null) {
                                hipotecarPropiedad((lote) temp);
                                posicionar();
                            }
                        } else {
                            JOptionPane.showMessageDialog(null, "No dispone de dinero, por lo tanto se hará un prestamo al banco para cubrir la deuda", "Atencion", JOptionPane.INFORMATION_MESSAGE);
                            prestarDinero(getDinero() - 200);
                            posicionar();
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "No dispone de dinero, por lo tanto se hará un prestamo al banco para cubrir la deuda", "Atencion", JOptionPane.INFORMATION_MESSAGE);
                        prestarDinero(getDinero() - 200);
                        posicionar();
                    }
                } else {

                    setDinero(getDinero() - 200);
                    JOptionPane.showMessageDialog(null, "Usted ha pagado la suma de " + Float.toString(200f), "Atencion", JOptionPane.INFORMATION_MESSAGE);

                }
                break;
            case 5:
                ficha.setBounds(312, 572, 50, 50);

                break;
            case 6:
                ficha.setBounds(252, 572, 50, 50);

                break;
            case 7:
                ficha.setBounds(198, 572, 50, 50);
                tg.mostrarSuerte((int)(Math.random()*12+1), this, props);
                break;
            case 8:
                ficha.setBounds(147, 572, 50, 50);

                break;
            case 9:
                ficha.setBounds(91, 572, 50, 50);

                break;
            case 10:
                ficha.setBounds(0, 572, 50, 50);
                break;
            case 11:
                ficha.setBounds(0, 501, 50, 50);

                break;
            case 12:
                ficha.setBounds(0, 451, 50, 50);
                break;
            case 13:
                ficha.setBounds(0, 383, 50, 50);

                break;
            case 14:
                ficha.setBounds(0, 331, 50, 50);

                break;
            case 15:
                ficha.setBounds(0, 282, 50, 50);

                break;
            case 16:
                ficha.setBounds(0, 243, 50, 50);

                break;
            case 17:
                ficha.setBounds(0, 206, 50, 50);
                tg.mostrarComunidad((int)(Math.random()*12+1), this, props);
                break;
            case 18:
                ficha.setBounds(0, 157, 50, 50);
                break;
            case 19:
                ficha.setBounds(0, 104, 50, 50);

                break;
            case 20:
                ficha.setBounds(0, 0, 50, 50);
                break;
            case 21:
                ficha.setBounds(89, 0, 50, 50);

                break;
            case 22:
                ficha.setBounds(143, 0, 50, 50);
                 tg.mostrarSuerte((int)(Math.random()*12+1), this, props);
                break;
            case 23:
                ficha.setBounds(198, 0, 50, 50);

                break;
            case 24:
                ficha.setBounds(253, 0, 50, 50);

                break;
            case 25:
                ficha.setBounds(313, 0, 50, 50);
                break;
            case 26:
                ficha.setBounds(367, 0, 50, 50);

                break;
            case 27:
                ficha.setBounds(422, 0, 50, 50);

                break;
            case 28:
                ficha.setBounds(474, 0, 50, 50);
                break;
            case 29:
                ficha.setBounds(539, 0, 50, 50);

                break;
            case 30:
                ficha.setBounds(592, 0, 50, 50);
                this.turnos_perdidos = 3;
                this.preso = true;
                posicion = 10;
                ficha.setBounds(0, 570, 50, 50);
                break;
            case 31:
                ficha.setBounds(600, 104, 50, 50);

                break;
            case 32:
                ficha.setBounds(600, 157, 50, 50);

                break;
            case 33:
                ficha.setBounds(600, 208, 50, 50);
                tg.mostrarComunidad((int)(Math.random()*12+1), this, props);
                break;
            case 34:
                ficha.setBounds(600, 244, 50, 50);

                break;
            case 35:
                ficha.setBounds(600, 279, 50, 50);

                break;
            case 36:
                ficha.setBounds(600, 331, 50, 50);
                tg.mostrarSuerte((int)(Math.random()*12+1), this, props);
                break;
            case 37:
                ficha.setBounds(600, 384, 50, 50);

                break;
            case 38:
                ficha.setBounds(600, 450, 50, 50);
                if (getDinero() < 100) {
                    if (tienePropiedades()) {
                        int resultado = JOptionPane.showConfirmDialog(null, "Desea hipotecar una propiedad para pagar?", "Atención", JOptionPane.INFORMATION_MESSAGE);
                        if (resultado == JOptionPane.OK_OPTION) {
                            hipoteca aux = new hipoteca(this);
                            propiedad temp = aux.mostrar();
                            if (temp != null) {
                                hipotecarPropiedad((lote) temp);
                                posicionar();
                            }
                        } else {
                            JOptionPane.showMessageDialog(null, "No dispone de dinero, por lo tanto se hará un prestamo al banco para cubrir la deuda", "Atencion", JOptionPane.INFORMATION_MESSAGE);
                            prestarDinero(getDinero() - 100);
                            posicionar();
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "No dispone de dinero, por lo tanto se hará un prestamo al banco para cubrir la deuda", "Atencion", JOptionPane.INFORMATION_MESSAGE);
                        prestarDinero(getDinero() - 100);
                        posicionar();
                    }
                } else {

                    setDinero(getDinero() - 100);
                    JOptionPane.showMessageDialog(null, "Usted ha pagado la suma de " + Float.toString(100f), "Atencion", JOptionPane.INFORMATION_MESSAGE);

                }
                break;
            case 39:
                ficha.setBounds(600, 502, 50, 50);

                break;
        }
        if (props[posicion] != null) {
            props[posicion].Accion(this);
        }
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the dinero
     */
    public float getDinero() {
        return dinero;
    }

    /**
     * @param dinero the dinero to set
     */
    public void setDinero(float dinero) {
        this.dinero = dinero;
    }

    /**
     * @return the posicion
     */
    public int getPosicion() {
        return posicion;
    }

    /**
     * @param posicion the posicion to set
     */
    public void setPosicion(int posicion) {
        this.posicion = posicion;
    }

    /**
     * @return the propiedades
     */
    public ArrayList<propiedad> getPropiedades() {
        return propiedades;
    }

    /**
     * @param propiedades the propiedades to set
     */
    public void setPropiedades(ArrayList propiedades) {
        this.propiedades = propiedades;
    }

    /**
     * @return the preso
     */
    public boolean isPreso() {
        return preso;
    }

    /**
     * @param preso the preso to set
     */
    public void setPreso(boolean preso) {
        this.preso = preso;
    }

    /**
     * @return the pase
     */
    public boolean isPase() {
        return pase;
    }

    /**
     * @param pase the pase to set
     */
    public void setPase(boolean pase) {
        this.pase = pase;
    }

    /**
     * @return the turnos_perdidos
     */
    public int getTurnos_perdidos() {
        return turnos_perdidos;
    }

    /**
     * @param turnos_perdidos the turnos_perdidos to set
     */
    public void setTurnos_perdidos(int turnos_perdidos) {
        this.turnos_perdidos = turnos_perdidos;
    }

    /**
     * @return the ficha
     */
    public JLabel getFicha() {
        return ficha;
    }

    /**
     * @param ficha the ficha to set
     */
    public void setFicha(JLabel ficha) {
        this.ficha = ficha;
    }

    /**
     * @return the deuda
     */
    public float getDeuda() {
        return deuda;
    }

    public void prestarDinero(float cantidad) {
        this.deuda += cantidad;
        this.dinero += cantidad;
    }

    public void pagarDeuda(float cantidad) {
        this.deuda -= cantidad;
        if (cantidad < 0) {
            dinero = cantidad - deuda;
            deuda = 0;
        }
    }

    public void hipotecarPropiedad(lote lugar) {
        lugar.setHipotecada(true);
        dinero += lugar.getPrecio() / 2;
    }

    public void pagarHipoteca(lote lugar) {
        lugar.setHipotecada(false);
        dinero -= lugar.getPrecio() / 2;
    }

    public boolean tienePropiedades() {
        for (int i = 0; i < propiedades.size(); i++) {
            if (propiedades.get(i).getTipo() == propiedad.TIPO_LOTE) {
                if (!((lote) propiedades.get(i)).isHipotecada()) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * @return the num_servicios
     */
    public int getNum_servicios() {
        return num_servicios;
    }

    /**
     * @param num_servicios the num_servicios to set
     */
    public void setNum_servicios(int num_servicios) {
        this.num_servicios = num_servicios;
    }

    /**
     * @return the tiros
     */
    public int getTiros() {
        return tiros;
    }

    /**
     * @param tiros the tiros to set
     */
    public void setTiros(int tiros) {
        this.tiros = tiros;
    }
}
